<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>面向对象</title>
  </head>
  <body></body>
  <script>
    /**
      类的声明
      */
    function Animal() {
      this.name = "name";
    }
    /**
    es6
    */
    class Animal2 {
      constructor() {
        this.name = name;
      }
    }
    // 实例化 与 继承

    //1. 构造函数继承
    function Parent1() {
      this.name = "parent1";
    }
    Parent1.prototype.say = function () {};
    function Child1() {
      //构造函数继承  (部分继承 , 原型对象的 属性方法 不能 被继承)
      Parent1.call(this); //改变 函数运行 上下文
      this.type = "child1";
    }
    //2. 原型链继承 (改变的是同一 对象  不符合需求)
    function Parent2() {
      this.name = "Parent2";
    }
    function Child2() {
      this.type = "child2";
    }
    Child2.prototype = new Parent2();

    //3 组合方式 最终优化 (1.对象实例 隔离   2.明确 指定其构造函数)
    function Parent3() {
      this.name = "Parent2";
      this.play = [1, 2, 3];
    }
    function Child3() {
      Parent3.call(this);
      this.type = "child3";
    }
    Child3.prototype = Object.create(Parent3.prototype);
    Child3.prototype.constructor = Child3;
    // Child2.prototype = new Parent2();
  </script>
</html>
